package com.client.elements.normal;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.ScrollEvent;
import com.google.gwt.event.dom.client.ScrollHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.Widget;
import com.client.services.SortService;
import com.client.services.SortServiceAsync;

public class Zufallszahlensortierung {

	public static Widget zufallszahlensortierung(){
		final FlowPanel panel_start = new FlowPanel();

		Button start = new Button();
		start.setSize("150px", "35px");
		start.setText("Start Sortierung");
		panel_start.add(start);

		final ScrollPanel scroll_1 = new ScrollPanel();
		final HTML text_1 = new HTML();
		text_1.setSize("50px", "300px");
		scroll_1.add(text_1);
		scroll_1.addStyleName("border");

		final ScrollPanel scroll_2 = new ScrollPanel();
		final HTML text_2 = new HTML();
		text_2.setSize("50px", "300px");
		scroll_2.add(text_2);
		scroll_2.addStyleName("border");

		final ScrollPanel scroll_3 = new ScrollPanel();
		final HTML text_3 = new HTML();
		text_3.setSize("50px", "300px");
		scroll_3.add(text_3);
		scroll_3.addStyleName("border");

		scroll_2.addScrollHandler(new ScrollHandler() {
			public void onScroll(ScrollEvent event) {
				scroll_3.setVerticalScrollPosition(scroll_2.getVerticalScrollPosition());
			}
		});

		scroll_3.addScrollHandler(new ScrollHandler() {
			public void onScroll(ScrollEvent event) {
				scroll_2.setVerticalScrollPosition(scroll_3.getVerticalScrollPosition());
			}
		});

		Button btn_close = new Button();
		btn_close.setStyleName("popup_close_btn");

		final FlexTable table = new FlexTable();
		table.setCellSpacing(3);
		table.setWidget(0, 0, new HTML("unsort."));
		table.setWidget(0, 1, new HTML("Server"));
		table.setWidget(0, 2, new HTML("Client"));
		table.setWidget(1, 0, scroll_1);
		table.setWidget(1, 1, scroll_2);
		table.setWidget(1, 2, scroll_3);
		table.setWidget(1, 3, btn_close);
		panel_start.add(table);

		table.setVisible(false);

		btn_close.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				table.setVisible(false);
				text_1.setText("");
				text_2.setText("");
				text_3.setText("");
			}
		});

		start.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				SortServiceAsync sortService = GWT.create(SortService.class);
				sortService.sortServer(new AsyncCallback<int[]>() {
					@Override
					public void onSuccess(int[] result) {
						String ausgabetext = "";
						for (int i = 0; i < result.length/2; i++) {
							ausgabetext = ausgabetext + result[i] + "<br>"; 
						}
						text_1.setHTML(ausgabetext);	

						ausgabetext = "";
						for (int i = result.length/2; i < result.length; i++) {
							ausgabetext = ausgabetext + result[i] + "<br>"; 
						}
						text_2.setHTML(ausgabetext);	

						final int[] zufallszahlen = new int[result.length / 2];
						for (int j = 0; j < zufallszahlen.length; j++) {
							zufallszahlen[j] = result[j];
						}
						quicksort(zufallszahlen, 0, zufallszahlen.length-1);

						ausgabetext = "";
						for (int i = 0; i < zufallszahlen.length; i++) {
							ausgabetext = ausgabetext + zufallszahlen[i] + "<br>"; 
						}
						text_3.setHTML(ausgabetext);
					}
					@Override
					public void onFailure(Throwable caught) {
						Window.alert("Es ist ein Fehler aufgetreten: " + caught.getMessage());
					}
				});
				table.setVisible(true);
			}
		});
		return panel_start;
	}

	static int array_zufallszahlen[] = new int[1000];

	public static void quicksort(int[] array_zufallszahlen, int links_0, int rechts_0)
	{
		//Initialisierung der lokalen Variablen
		int zeiger_links = links_0;
		int zeiger_rechts = rechts_0;
		int hilfsvariable;

		// Berechnung des Pivot-Element
		long pivot = array_zufallszahlen[(zeiger_links + zeiger_rechts) /2];

		//Solange sich die Zeiger nicht treffen
		while (zeiger_links <= zeiger_rechts)
		{
			//Pivot ist die Grenze
			//Sortierung von links
			while(array_zufallszahlen[zeiger_links]<pivot)
			{
				zeiger_links++;
			}
			//Sortierung von rechts.
			while(array_zufallszahlen[zeiger_rechts]>pivot)
			{
				zeiger_rechts--;
			}

			// Wenn die Werte getauscht werden m�ssen, werden sie getauscht.
			if (zeiger_links<=zeiger_rechts)
			{
				hilfsvariable=array_zufallszahlen[zeiger_links];
				array_zufallszahlen[zeiger_links]=array_zufallszahlen[zeiger_rechts];
				array_zufallszahlen[zeiger_rechts]=hilfsvariable;
				zeiger_links++;
				zeiger_rechts--;
			}
		}

		//Methode wird nun mit den neuen Teilen des Arrays aufgerufen(-->Rekursion)
		if(links_0 < zeiger_rechts) quicksort(array_zufallszahlen, links_0, zeiger_rechts);
		if(zeiger_links < rechts_0) quicksort(array_zufallszahlen, zeiger_links, rechts_0);
	}
}